//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : Readme.html
// 文件名   : BitSet.h
// 作者     : Aiye
// 日期     : 2025/9/7 21:12
// 邮箱     : 2878548868@qq.com
// 摘要     : 介绍位集
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef README_HTML_BITSET_H
#define README_HTML_BITSET_H
#include <bitset>
#include <iostream>
#include <ostream>

/**
 * @brief 固定大小的位序列容器，高效地存储和操作位标志
 */
class BitSet
{
public:
    BitSet()
    {
        std::bitset<8> bits1{}; // 默认全是0
        std::bitset<8> bits2{0b11110000}; // 二进制初始化
        std::bitset<8> bits3{0x12}; // 十六进制初始化

        bits1[0] = true; // 设置第0位
        auto bit = bits1[1]; // 获取第1位

        // 位运算
        auto bitResult = bits1 & bits2; // 按位与
        bitResult = bits2 | bits1; // 按位或
        bitResult = bits1 ^ bits2; // 按位异或

        // 位移操作
        bitResult = bits2 << 2; // 左移两位，普通位移，不是循环位移
        bitResult = bits2 >> 2; // 右移两位

        // 统计操作
        std::cout << "Number of set bits:" << bits2.count() << std::endl;
        std::cout << "Total size:" << bits2.size() << std::endl;

        if (bits2.test(2))
        { // 测试第二位是否为1
            std::cout << "Bit 2 is set" << std::endl;
        }

        // 设置、重置、翻转位
        bits2.set(3); // 设置第三位为1
        bits2.reset(3); // 设置第三位为0
        bits2.flip(3); // 翻转第3位

        // 所有位操作
        if (bits2.all())
        { // 是否所有位都为1
            std::cout << "All bits are set" << std::endl;
        }

        if (bits2.any())
        { // 是否有任何位为1
            std::cout << "At least one bit is set" << std::endl;
        }

        if (bits2.none())
        { // 是否所有位都为0
            std::cout << "No bits are set" << std::endl;
        }
    }
};
#endif //README_HTML_BITSET_H